/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ideastec.mipyme.persistence;

import java.util.List;
import java.io.Serializable;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
 * Clase Padre de los DAOS. Todos los DAOS deben extender de el
 * 
 * @author Diego Rafael Graf
 */

public abstract class DAOPadre<T> extends HibernateDaoSupport {
    
    protected Class<T> persistentClass = getClase();
    
    protected abstract Class<T> getClase(); 
    
    //Consulta todos los objetos persistentes de una clase
    public List<T> buscarTodos() throws Exception{
        try{
            return this.getHibernateTemplate().find("from " + persistentClass.getName());
        }
        catch(Exception e){
            throw new Exception(e);
        }
    }
    
    //Consulta un objeto determinado por su id
    public T buscarPorID(Serializable id) throws Exception{
        try{
            return (T) this.getHibernateTemplate().get(persistentClass, id);
        }
        catch(Exception e){
            throw new Exception(e);
        }
    }  
    
    /*public List<T> buscarPor(T ejemplo) {
       return this.getHibernateTemplate().findByExample(ejemplo);
    }*/
    
    //Cuenta todos los objetos persistentes de una clase
    public Long contarTodos() throws Exception{
        try{
            Query query = this.getSession().createQuery("select count * from " + persistentClass.getName());
            return (Long) query.uniqueResult();
        }
        catch(Exception e){
            throw new Exception(e);
        }
        
    }    
    
    //Almacena una entidad persistible en la base de datos
    public void guardar(T entidadPersistible) throws Exception{
        try{
            this.getHibernateTemplate().save(entidadPersistible);
        }
        catch(Exception e){
            throw new Exception(e);
        }
    }
    
    //Actualiza una entidad persistible
    public void actualizar(T entidadPersistible) throws Exception{
        try{
            this.getHibernateTemplate().update(entidadPersistible);
        }
        catch(Exception e){
            throw new Exception(e);
        }
        
    }
    
    //Actualiza o guarda una entidad en caso de que exista o no en la Base
    //datos acorde a su id
    public void guardarOActualizar(T entidadPersistible) throws Exception{
        try{
            this.getHibernateTemplate().saveOrUpdate(entidadPersistible);
        }
        catch(Exception e){
            throw new Exception(e);
        }
    }
    
    //Elimina una entidad persistible de la BD
    public void borrar(T entidadPersistible) throws Exception{
        try{
            this.getHibernateTemplate().delete(entidadPersistible);
        }
        catch(Exception e){
            throw new Exception(e);
        }
            
    }
    
    /*public void borrarPor(Serializable id) {
        T entidadPersistible = this.buscarPor(id);
        this.getHibernateTemplate().delete(entidadPersistible);
    }*/   
    
}
